//
//  LZEssenceViewController.m
//  BuDeJie
//
//  Created by xiaomage on 16/3/31.
//  Copyright © 2016年 小码哥. All rights reserved.
//

#import "LZEssenceViewController.h"
#import "LZTitleButton.h"

#import "LZAllViewController.h"
#import "LZVideoViewController.h"
#import "LZVoiceViewController.h"
#import "LZPictureViewController.h"
#import "LZWordViewController.h"

@interface LZEssenceViewController () <UIScrollViewDelegate>
/** 标题栏 */
@property (nonatomic, weak) UIView *titlesView;
/** contentScrollView*/
@property (nonatomic, weak) UIScrollView *contentScrollView;
/** 标题下划线 */
@property (nonatomic, weak) UIView *titleUnderline;
/** 记录最后一次滚动scrollView的下标 */
@property (nonatomic, assign) NSInteger tempIndex;
/** 上一次点击的标题按钮 */
@property (nonatomic, weak) LZTitleButton *previousClickedTitleButton;
@end

@implementation LZEssenceViewController
#pragma mark - 初始化
// 处理cell间距
- (void)viewDidLoad {
    [super viewDidLoad];
    // 初始值为0,因为默认显示的是第一个界面
    self.tempIndex = 0;
    // 设置导航条内容
    [self setupNavBar];
    // 初始化子控制器
    [self setupChildVcs];
    // scrollView
    [self setupScrollView];
    // 标题栏
    [self setupTitlesView];
}

/**
 *  初始化子控制器
 */
- (void)setupChildVcs
{
    [self addChildViewController:[[LZAllViewController alloc] init]];
    [self addChildViewController:[[LZVideoViewController alloc] init]];
    [self addChildViewController:[[LZVoiceViewController alloc] init]];
    [self addChildViewController:[[LZPictureViewController alloc] init]];
    [self addChildViewController:[[LZWordViewController alloc] init]];
}

/**
 *  scrollView
 */
- (void)setupScrollView
{
    NSInteger count = self.childViewControllers.count;
    // 不要去自动调整scrollView的内边距
    self.automaticallyAdjustsScrollViewInsets = NO;
    UIScrollView *scrollView = [[UIScrollView alloc] init];
    scrollView.frame = self.view.bounds;
    // 点击状态栏时,这个scrollView不需要滚动到顶部
    scrollView.scrollsToTop = NO;
    scrollView.backgroundColor = [UIColor greenColor];
    scrollView.showsHorizontalScrollIndicator = NO;
    scrollView.showsVerticalScrollIndicator = NO;
    [self.view addSubview:scrollView];
    _contentScrollView = scrollView;
    scrollView.delegate = self;
    // 其他设置
    scrollView.contentSize = CGSizeMake(count * scrollView.width, 0);
    scrollView.pagingEnabled = YES;
}

/**
 *  标题栏
 */
- (void)setupTitlesView
{
    UIView *titlesView = [[UIView alloc] init];
    titlesView.frame = CGRectMake(0, LZNavBarMaxY, self.view.width, LZTitlesViewH);
    titlesView.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:0.5];
    [self.view addSubview:titlesView];
    self.titlesView = titlesView;
    
    // 标题按钮
    [self setupTitleButtons];
    
    // 下划线
    [self setupTitleUnderline];
}

/**
 *  下划线
 */
- (void)setupTitleUnderline
{
    // 取出标题按钮
    LZTitleButton *firstTitleButton = self.titlesView.subviews.firstObject;
    
    UIView *titleUnderline = [[UIView alloc] init];
    CGFloat titleUnderlineH = 2;
    CGFloat titleUnderlineY = self.titlesView.height - titleUnderlineH;
    titleUnderline.frame = CGRectMake(0, titleUnderlineY, 0, titleUnderlineH);
    titleUnderline.backgroundColor = [firstTitleButton titleColorForState:UIControlStateSelected];
    [self.titlesView addSubview:titleUnderline];
    self.titleUnderline = titleUnderline;
    
    // 新点击的按钮 -> 红色
//    firstTitleButton.selected = YES;
//    self.previousClickedTitleButton = firstTitleButton;
    
    // 下划线
    [firstTitleButton.titleLabel sizeToFit];
    self.titleUnderline.width = firstTitleButton.titleLabel.width + 10;
    self.titleUnderline.centerX = firstTitleButton.centerX;
}

/**
 *  标题按钮
 */
- (void)setupTitleButtons
{
    NSArray *titles = @[@"全部", @"视频", @"声音", @"图片", @"段子"];
    NSUInteger count = titles.count;
    CGFloat titleButtonH = self.titlesView.height;
    CGFloat titleButtonW = self.titlesView.width / count;
    
    for (NSInteger i = 0; i < count; i++) {
        LZTitleButton *titleButton = [[LZTitleButton alloc] init];
        titleButton.tag = i;
        [titleButton setTitle:titles[i] forState:UIControlStateNormal];
        [titleButton addTarget:self action:@selector(titleButtonClick:) forControlEvents:UIControlEventTouchUpInside];
        titleButton.frame = CGRectMake(i * titleButtonW, 0, titleButtonW, titleButtonH);
        [self.titlesView addSubview:titleButton];
        if (i == 0) {
            [self titleButtonClick:titleButton];
        }
    }

}

// 设置导航条内容
- (void)setupNavBar
{
    // 左边
    UIBarButtonItem *leftItem =
    [UIBarButtonItem itemWithTarget:self action:@selector(game) image:@"nav_item_game_icon" highImage:@"nav_item_game_click_icon"];
    
    self.navigationItem.leftBarButtonItem = leftItem;
    
    // 右边
    UIBarButtonItem *rightItem = [UIBarButtonItem itemWithTarget:nil action:nil image:@"navigationButtonRandom" highImage:@"navigationButtonRandomClick"];
    
    self.navigationItem.rightBarButtonItem = rightItem;
    
    // 中间 titleView
    self.navigationItem.titleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"MainTitle"]];
}

#pragma mark - 监听点击
/**
 *  监听标题按钮点击
 */
- (void)titleButtonClick:(LZTitleButton *)titleButton
{
    // 0.判断
    if (self.previousClickedTitleButton == titleButton) {
        // 发出通知
        [LZNotificationCenter postNotificationName:LZTitleButtonDidRepeatClickNotification object:nil userInfo:nil];
    }
    
    // 1.选中按钮
    [self selectButton:titleButton];
    // 2.把按钮文字对应的控制器的View添加到对应的位置
    // 2.1拿到button绑定的索引,tag
    NSInteger index = titleButton.tag;

    // 这行代码写在这,表示的意义是:先把要显示的view加载完毕了,最后把移动下划线的动画给执行了
//    [self setupOneChildViewController:index];
    
    // 下划线
    [UIView animateWithDuration:1.0 animations:^{
        // 这句代码一定要放在设置中心点的前面
        // 只有一个控件有了尺寸之后，设置它的中心点才是准确的
        self.titleUnderline.width = titleButton.titleLabel.width + 10;
        self.titleUnderline.centerX = titleButton.centerX;
        
        CGFloat x = index * ScreenW;
        [self.contentScrollView setContentOffset:CGPointMake(x, 0) animated:YES];
        /*
//        // 个人觉得，下面两行代码可以写外面和里面都没有什么明显的不同
//        CGFloat x = index * ScreenW;
//        // 3.设置scrollView移动到要显示的view上,前面的操作已经把对应子控制器的View排布好了
//        // 设置setContentOffset默认会频繁调用scrollViewDidScroll方法,
//        // 但是不会调用scrollViewDidEndDecelerating方法
//        [self.contentScrollView setContentOffset:CGPointMake(x, 0) animated:YES];
         */
    } completion:^(BOOL finished) {
        
        // 添加index位置的子控制器view到scrollView中,感觉这行代码可以写在
        // NSInteger i = titleButton.tag;这行代码下面，不过有关系
        // 放在这里,前面已经平移过去了，你的控制器的view还没有加上去，会有一段时间显示scrollView
        // 的背景色-绿色,之后再显示控制器的view，如果放在NSInteger i = titleButton.tag;这行代码下面,那么不会看到scrollView的背景色-绿色
//        这行代码写在这,表示的意义是:先把把移动下划线的动画给执行了,最后把要显示的view加载完毕了
        [self setupOneChildViewController:index];
    }];
    
    // 控制scrollView的scrollsToTop属性
    NSInteger count = self.childViewControllers.count;
    for (NSInteger i = 0; i < count; i++) {
        
        UIViewController *VC = self.childViewControllers[i];
        
        // 1.如果控制器的view没有被加上去,那么就结束本次循环
        // 因为没有view，怎么去设置它的scrollsToTop属性
        if (!VC.isViewLoaded) continue;
        // 2.从self.childViewControllers[i]拿到的可能是UIViewController,
        // 可能是UITableViewController,要是UIScrollView的类型或者子类才可以设置
        // scrollsToTop属性,所以要判断
        if (![VC.view isKindOfClass:[UIScrollView class]]) continue;
        
        // 如果控制器的view是scrollView
        // 强制类型转换
        UIScrollView *scrollView = (UIScrollView *)VC.view;
        // 滚动到顶部
        scrollView.scrollsToTop = (index == i);
    }
}

//- (void)selectButton:(LZTitleButton *)titleButton WithTask:(void (^)())task WithCompletion:(void (^)())completion
//{
//    // 修改按钮的状态
//    // 上一个点击的按钮 -> 暗灰色
//    self.previousClickedTitleButton.selected = NO;
//    // 新点击的按钮 -> 红色
//    titleButton.selected = YES;
//    self.previousClickedTitleButton = titleButton;
//    
//    // 下划线
//    [UIView animateWithDuration:1.0 animations:^{
//        self.titleUnderline.width = titleButton.titleLabel.width + 10;
//        self.titleUnderline.centerX = titleButton.centerX;
//        
//        // 可能会做其他事情,block
//        if (task)   task();
//    } completion:^(BOOL finished) {
//        
//        if (completion) completion();
//    }];
//}

- (void)selectButton:(LZTitleButton *)titleButton
{
    // 修改按钮的状态
    // 上一个点击的按钮 -> 暗灰色
    self.previousClickedTitleButton.selected = NO;
    // 新点击的按钮 -> 红色
    titleButton.selected = YES;
    self.previousClickedTitleButton = titleButton;
}


#pragma mark - 把子控制器的view添加
- (void)setupOneChildViewController:(NSInteger)i
{
    UIViewController *vc = self.childViewControllers[i];
    
    // 判断下有没有父控件
    if (vc.isViewLoaded) return;
    // 或者
//    if (vc.view.superview) {
//        return;
//    }
    // 设置vc的view的位置,这里用到了控制器的view，会调用viewDidLoad方法
    vc.view.frame = CGRectMake(i * ScreenW, 0, ScreenW, self.contentScrollView.bounds.size.height);
    [self.contentScrollView addSubview:vc.view];
}

#pragma mark - UIScrollViewDelegate 方法
// 减速完毕之后调用
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    
    // 设置滚动停止之后该视图所对应的按钮的文字颜色
    // 1.拿到滚动到的视图的下标
    NSInteger i = (NSInteger)(scrollView.contentOffset.x / ScreenW);
    // 2.获取选中标题按钮
    LZTitleButton *selectButton = self.titlesView.subviews[i];
    // 3.点击按钮
    [self titleButtonClick:selectButton];
    
//    // 个人觉得，下面两行代码可以写外面和里面都没有什么明显的不同
//    CGFloat x = self.lastI * ScreenW;
//    // 3.设置scrollView移动到要显示的view上,前面的操作已经把对应子控制器的View排布好了
//    // 设置setContentOffset默认会频繁调用scrollViewDidScroll方法,
//    // 但是不会调用scrollViewDidEndDecelerating方法
//    [self.contentScrollView setContentOffset:CGPointMake(x, 0) animated:YES];

}

// 问题
//- (void)scrollViewDidScroll:(UIScrollView *)scrollView
//{
//    // LZFuc
//    // 设置滚动停止之后该视图所对应的按钮的文字颜色
//    // 1.拿到滚动到的视图的下标
//    NSInteger i = (NSInteger)(scrollView.contentOffset.x / ScreenW + 0.5);
//    // 2.获取选中标题按钮
//    LZTitleButton *selectButton = self.titlesView.subviews[i];
//
//    if (self.lastI != i) {  // 判断最后一次的下标和现在的下标,不相等,说明到一半了
//        // 3.点击按钮
//        [self titleButtonClick:selectButton];
//    }
//    // 把这次的赋值给上次的
//    self.lastI = i;
//}


- (void)game
{
    
}

@end
